package structureDeDonnee;

import java.util.Iterator;

/**
 * structure de données représentant une configuration du jeu de la vie
 *  capable de donner un iterateur sur la liste des cellules vivantes.
 */
public interface Matrice {

	/**
	 * additionne 2 matrices
	 * 
	 * @param arg
	 *            la deuxieme matrice
	 * @return la nouvelle matrice
	 */
	public Matrice addAll(Matrice arg);

	/**
	 * ajouter une cellule vivante a la matrice à la fin de celle ci 
	 * 
	 * @param c
	 *            la cellule a ajouter
	 */
	public void add(Cell c);
	
	/**
	 * ajouter une cellule vivante a la matrice 
	 * de manière à maintenir la matrice triée 
	 * Ne doit pas être utilisé si this est vide
	 * 
	 * @param c
	 *            la cellule a ajouter
	 */
	public void inserer(Cell c);


	/**
	 * retourne une répresentation de la liste sous forme de String
	 * 
	 * @return la String formée
	 */
	public String toString();

	/**
	 * renvoie un iterator sur la liste appelante
	 * 
	 * @return l'iterateur
	 */
	public Iterator<Cell> iterator();

	/**
	 * dit si la liste est vide
	 * 
	 * @return true si la liste est vide false sinon
	 */
	public boolean isEmpty();

	/**
	 * renvoie la premiere cellule de la liste
	 * 
	 * @return la premiere cellule de la liste
	 */
	public Cell getPremiereCellule();

	/**
	 * renvoie la dernière cellule de la liste
	 * 
	 * @return la dernière cellule de la liste
	 */
	public Cell getDerniereCellule();
	
	/**
	 * donne la longueur de la Matrice
	 * 
	 * @return la longueur de la Matrice
	 */
	public int length();

	/**
	 * Teste si une Cellule est dans la matrice appelante
	 * 
	 * @param c
	 *            la cellule
	 * @return true si elle y est false sinon
	 */
	public boolean contains(Cell c);

	/**
	 * renvoie une nouvelle Matrice triée, necessite que les éléments de la
	 * Matrice implémente l'interface comparable
	 * 
	 * @return la matrice triée
	 */
	public Matrice sort();

	/**
	 * renvoie une copie de la Matrice appelante
	 * 
	 * @return la copie de la Matrice
	 */
	public Matrice clone();
	
	
/**
 * verifie si une matrice contient les mêmes cellules que this
 * @return true si oui false sinon
 */
	public boolean memeMatrice(Matrice m);
}
